<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <title>文档</title>
  <link href="./css/semantic/semantic.min.css" rel="stylesheet">
  <link href="./css/markdown.css" rel="stylesheet">
  <style>
    body{padding-top:0;background:#f7f7f7}
    body>.ui.container{width:100%;padding:0}
    #project-title{background:#6e6e6e;width:100%;line-height:3.572rem;color:#fff;font-size:1.2rem}
    #project-title .title-wrap{font-weight:700;padding:0 12px;width:100%;max-width:1366px!important;min-width:900px;margin:0 auto}
    #project-title .left,#project-title right{display:inline-block}
    #project-title .right{float:right}
    #project-title .right .wiki-actions .menu{left:auto;right:0;margin-top:.4em!important}
    #wiki-preview-container{width:100%;max-width:1366px!important;min-width:900px;padding:0;border:1px solid #e3e9ed;border-top:0}
    #wiki-preview>.ui.segment{margin-top:0;padding:1rem;padding-left:0;border:0}
    .hover-places{display:inline-block}
    #page-detail{width:60%;margin:0 auto}
    #page-detail .title{font-weight:700;font-size:24px;padding:12px 0;border-bottom:1px solid #ccc}
    #page-detail .content{margin-top:15px}
    .content p{word-wrap:break-word}
    #wiki-parent,#wiki-title,#wikis{display:none}
    .ui.grid{padding:0!important}
    #ex-all{cursor:pointer;color:#537c8d}
  </style>
</head>
<body>
  <div class="ui container">
    <div id="project-title">
      <div class="title-wrap">
        <div class="left">
          <i class="icon eye"></i>
          文档预览:
          wpf-agv-laser
        </div>
        <div class="right">
          Export by Gitee
        </div>
      </div>
    </div>

    <div class="ui container" id="wiki-preview-container">
      <div id="wiki-preview">
        <div class="ui segment">
          <div id="page-detail" class="markdown-body">
            <div class='title'>ROS 安装</div><div class='content'><p>.keep</p>
</div><div class='title'>Json</div><div class='content'><h3><a class="anchor" id="json-string-to-object_1" href="#json-string-to-object_1"></a>Json String To Object</h3>
<p><code>NavigationOccupancyGrid ng = JsonConvert.DeserializeObject&lt;NavigationOccupancyGrid&gt;(str);</code></p>
<h3><a class="anchor" id="json-object-to-string_1" href="#json-object-to-string_1"></a>Json Object TO String</h3>
<p><code>string str = JsonConvert.SerializeObject(Map_navigationOccupancyGrid, Formatting.Indented);</code></p>
</div><div class='title'>ROS地图</div><div class='content'><h4><a class="anchor" id="map与costmap都是以nav-msgs-occupancygrid类型发布其topic-其中整张地图的障碍物信息存放在data数据成员中-data是一个int8类型的vector向量-即一维数组-假设一张pgm的map地图-宽-width-高-height-单位为像素-分辨路为resolution-左下角像素点在世界坐标系下的位置为-ox-oy-单位米-那么世界坐标系下一点-x-y-单位米-假设其在地图中-那么该点对应的data中的索引index为-_1" href="#map与costmap都是以nav-msgs-occupancygrid类型发布其topic-其中整张地图的障碍物信息存放在data数据成员中-data是一个int8类型的vector向量-即一维数组-假设一张pgm的map地图-宽-width-高-height-单位为像素-分辨路为resolution-左下角像素点在世界坐标系下的位置为-ox-oy-单位米-那么世界坐标系下一点-x-y-单位米-假设其在地图中-那么该点对应的data中的索引index为-_1"></a>map与costmap都是以nav_msgs::OccupancyGrid类型发布其topic。其中整张地图的障碍物信息存放在data数据成员中，data是一个int8类型的vector向量，即一维数组。假设一张pgm的map地图，宽：width，高：height，单位为像素，分辨路为resolution，左下角像素点在世界坐标系下的位置为：（ox,oy）,单位米，那么世界坐标系下一点（x,y）单位米，假设其在地图中，那么该点对应的data中的索引index为：</h4>
<p><code>index = (x-ox)/resolution+(y-oy)/resolution*width</code></p>
<h4><a class="anchor" id="-注-index为int8类型-所以要将结果进行下类型转换-那么该点在地图中的信息即为data-index-_1" href="#-注-index为int8类型-所以要将结果进行下类型转换-那么该点在地图中的信息即为data-index-_1"></a>（注：index为int8类型，所以要将结果进行下类型转换），那么该点在地图中的信息即为data[index]</h4>
<p>即：data是按照那张地图图片的自底向上，自左至右逐个像素点存储的</p>

<p>map中data存储的格式如下：</p>
<div class="white"><div class="highlight"><pre>0:空白区域

100:障碍物

-1:未知

1-99:根据像素的灰度值转换后的值，代表有障碍物的概率（不确定，猜测是这个含义，实际用的时候把这个值都当作无障碍物）
</pre></div></div><h4><a class="anchor" id="costmap中data存储格式如下-_1" href="#costmap中data存储格式如下-_1"></a>costmap中data存储格式如下：</h4><div class="white"><div class="highlight"><pre>0:空白区域

100:障碍物层

99:膨胀层

1-98:距离障碍物层的远近获得的代价值

-1:未知区域
</pre></div></div></div><div class='title'>功能界面</div><div class='content'><h3><a class="anchor" id="机器人-全局路径-本地路径-静态地图综合和动态展示_1" href="#机器人-全局路径-本地路径-静态地图综合和动态展示_1"></a>机器人、全局路径、本地路径，静态地图综合和动态展示</h3>
<p><img alt="输入图片说明" src="https://images.gitee.com/uploads/images/2018/0710/234035_a360c7d4_1509932.png" title="屏幕截图.png" />
<img alt="输入图片说明" src="https://images.gitee.com/uploads/images/2018/0710/234301_f90145a2_1509932.png" title="屏幕截图.png" /></p>
</div><div class='title'>ROS</div><div class='content'></div><div class='title'>Rbx1机器人及模拟器安装</div><div class='content'><h3><a class="anchor" id="1-准备工作-把下面这一堆命令复制到终端执行_1" href="#1-准备工作-把下面这一堆命令复制到终端执行_1"></a>1.准备工作，把下面这一堆命令复制到终端执行</h3><div class="white"><div class="highlight"><pre>sudo apt-get install ros-indigo-turtlebot-bringup \
ros-indigo-turtlebot-create-desktop ros-indigo-openni-* \
ros-indigo-openni2-* ros-indigo-freenect-* ros-indigo-usb-cam \
ros-indigo-laser-* ros-indigo-hokuyo-node \
ros-indigo-audio-common gstreamer0.10-pocketsphinx \
ros-indigo-pocketsphinx ros-indigo-slam-gmapping \
ros-indigo-joystick-drivers Python-rosinstall \
ros-indigo-orocos-kdl ros-indigo-python-orocos-kdl \
python-setuptools ros-indigo-dynamixel-motor-* \
libopencv-dev python-OpenCV ros-indigo-vision-opencv \
ros-indigo-depthimage-to-laserscan ros-indigo-arbotix-* \
ros-indigo-turtlebot-teleop ros-indigo-move-base \
ros-indigo-map-server ros-indigo-fake-localization \
ros-indigo-amcl Git subversion mercurial 
</pre></div></div><h3><a class="anchor" id="如果出现unable-to-locate的错误的话-先执行sudo-apt-get-update-再执行上述指令-接下来-从仓库中clone-rbx1源码包-如果之前没装过git的话要先装一下git-_1" href="#如果出现unable-to-locate的错误的话-先执行sudo-apt-get-update-再执行上述指令-接下来-从仓库中clone-rbx1源码包-如果之前没装过git的话要先装一下git-_1"></a>如果出现unable to locate的错误的话，先执行sudo apt-get update,再执行上述指令。接下来，从仓库中clone rbx1源码包，如果之前没装过git的话要先装一下git。</h3>
<p>执行下面的指令将rbx1 clone到本地。</p>
<div class="white"><div class="highlight"><pre>cd ~/catkin_ws/src
git clone https://github.com/pirobot/rbx1.git $ cd rbx1
git checkout indigo-devel
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
rospack profile
</pre></div></div><h3><a class="anchor" id="source指令保证当你打开一个新的终端后-你的catkin-packages在你的ros-package-path路径下-_1" href="#source指令保证当你打开一个新的终端后-你的catkin-packages在你的ros-package-path路径下-_1"></a>source指令保证当你打开一个新的终端后，你的catkin packages在你的ROS_PACKAGE_PATH路径下。</h3>
<p>装好之后，你的~/catkin_ws/src/rbx1目录下会有下面这些文件。</p>
<h3><a class="anchor" id="2-测试arbotix-simulator_1" href="#2-测试arbotix-simulator_1"></a>2.测试ARBOTIX SIMULATOR</h3>
<p>我们主要使用arbotix_python仿真器来测试代码应用到机器人上面的效果，之前的一堆指令中已经安装过arbotix。现在先在终端中输入roscore指令。 
然后启动仿真的TurtleBot机器人。再打开一个终端，启动fake_turtlebot.launch文件。
<code>roslaunch rbx1_bringup fake_turtlebot.launch</code></p>
<h3><a class="anchor" id="然后启动rviz仿真器-_1" href="#然后启动rviz仿真器-_1"></a>然后启动RViz仿真器。</h3>
<p><code>rosrun rviz rviz -d</code>rospack find rbx1_nav<code>/sim.rviz</code></p>
<h3><a class="anchor" id="这样就可以很方便的用可视化的工具观察机器人的运行状况-接下来通过发布twist消息来控制机器人的运动-_1" href="#这样就可以很方便的用可视化的工具观察机器人的运行状况-接下来通过发布twist消息来控制机器人的运动-_1"></a>这样就可以很方便的用可视化的工具观察机器人的运行状况。接下来通过发布Twist消息来控制机器人的运动。</h3>
<p><code>rostopic pub -r 10 /cmd_vel geometry_msgs/Twist &#39;{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}&#39;</code></p>
<h3><a class="anchor" id="这个消息的意思是-使机器人的线速度保持vx＝0-2m-s-自旋角速度保持0-5rad-s-这样机器人就会做圆周运动-仿真器运行结果如下-_1" href="#这个消息的意思是-使机器人的线速度保持vx＝0-2m-s-自旋角速度保持0-5rad-s-这样机器人就会做圆周运动-仿真器运行结果如下-_1"></a>这个消息的意思是，使机器人的线速度保持Vx＝0.2m/s,自旋角速度保持0.5rad/s，这样机器人就会做圆周运动。仿真器运行结果如下：</h3><h3><a class="anchor" id="如果想让机器人停下来的话-先ctrl＋c终止进程-再输入以下指令-_1" href="#如果想让机器人停下来的话-先ctrl＋c终止进程-再输入以下指令-_1"></a>如果想让机器人停下来的话，先Ctrl＋C终止进程，再输入以下指令：</h3>
<p><code>rrostopic pub -1 /cmd_vel geometry_msgs/Twist &#39;{}&#39;</code></p>
</div><div class='title'>WPF鼠标事件</div><div class='content'><h3><a class="anchor" id="主要有以下几种事件-_1" href="#主要有以下几种事件-_1"></a>主要有以下几种事件:</h3>
<ul class="task-list">
<li>主要事件                  子事件                   触发条件<br>
</li>
<li>MouseHover        鼠标悬停在控件发生<br>
</li>
<li>MouseLeave        鼠标离开控件时发生 EventHandler</li>
<li>MouseEnter        鼠标进入控件时发生 EventHandler</li>
<li>MouseMove     鼠标移动过程中重复发生   MouseEventHandler</li>
<li>MouseDown     鼠标键按下时发生            MouseEventHandler</li>
<li>MouseLeftButtonDown   鼠标左键按下时发生<br>
</li>
<li>MouseRightButtonDown  鼠标右键按下时发生<br>
</li>
<li>MouseUp       鼠标键松开时发生            MouseEventHandler</li>
<li>MouseLeftButtonUp 鼠标左键松开时发生<br>
</li>
<li>MouseRightButtonUp    鼠标右键松开时发生<br>
</li>
<li>MouseWheel        鼠标滚轮滚动时发生 MouseEventHandler</li>
</ul>

<p>另外还有Preview+事件   如： PreviewMouseMove 等等事件,   先于正常的鼠标事件发生。</p>

<p>发生顺序：</p>

<p>鼠标事件按以下顺序发生：</p>

<p>MouseEnter
MouseMove
MouseHover / MouseDown / MouseWheel
MouseUp
MouseLeave</p>

<p>与组件的绑定</p>

<p>组件名称.事件名称+=new System.EventHandler（事件名称）；</p>

<p>OR 组件名称.事件名称+=new System.MouseEventHandler（事件名称）；</p>

<p>鼠标事件使用条件</p>

<p>某些控件的功能增强： TreeView里面元素的拖动</p>

<p>或者自定义控件的许多功能： flash的时间轴</p>

<p>控件内拖动功能举例：</p>

<p>l  获得MouseDown时position。</p>

<p>l  在 MouseMove中检查鼠标左键按下情况 和 鼠标移动情况。</p>

<p>l  把移动的举例和系统提供的SystemParameters.MinimumHorizontalDragDistance比较</p>

<p>如：</p>

<p>Math.Abs(now.X-start.X)&gt;SystemParameters.MinimumHorizontalDragDistance</p>

<p>l  在MouseUp中根据左键的释放情况，判断释放拖动完成，然后做相应处理。</p>

<p>特殊问题解决</p>

<p>我们在编写程序代码过程中可能遇到某些鼠标事件完全不被触发的情况，如果你的MouseDown不触发，那么你可以试试PreviewMouseDown事件，其他事件类似，具体什么原因，我也不清楚，感觉MouseDown 与 PreviewMouseDown是两套独立的事件链，互相不影响。</p>

<p>MouseMove的触发不是按固定位移量触发的，（例如：鼠标滑动选择元件，若鼠标移动太快，某些被划过的元件就不被选择了），所以某些情况下在MouseMove里处理 不太可靠。</p>
</div><div class='title'>Json格式地图数据</div><div class='content'><div class="white"><div class="highlight"><pre>{
  "header": {
    "seq": 0,
    "stamp": {
      "secs": 1531007615,
      "nsecs": 19525437
    },
    "frame_id": "map"
  },
  "info": {
    "map_load_time": {
      "secs": 1531007615,
      "nsecs": 19525130
    },
    "resolution": 0.05,
    "width": 576,
    "height": 544,
    "origin": {
      "position": {
        "x": -13.8,
        "y": -12.2,
        "z": 0.0
      },
      "orientation": {
        "x": 0.0,
        "y": 0.0,
        "z": 0.0,
        "w": 1.0
      }
    }
  },
  "data": [
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    100,
    100,
    0,
    100,
    0,
    0,
    0,
    0,
    0,
    0,
    100,
    0,
    100,
    0,
    100,
    0,
    0,
    -1,
    -1,
    100,
    0,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    0,
    100,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    100,
    0,
    100,
    0,
    0,
    0,
    0,
    -1,
    -1,
    0,
    0,
    -1,
    -1,
    100,
    -1,
    -1,
    100,
    100,
    100,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    100,
    100,
    100,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    -1,
    0,
    0,
    -1,
    -1,
    0,
    -1,
    -1,
    -1,
    100,
    100,
    100,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    100,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    100,
    100,
    100,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    100,
    100,
    0,
    0,
    0,
    100,
    0,
    100,
    100,
    100,
    100,
    100,
    0,
    -1,
    -1,
    -1,
    -1,
    100,
    0,
    0,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
  ]
}
</pre></div></div></div><div class='title'>运行机器人</div><div class='content'><h3><a class="anchor" id="这里是列表文本运行机器人节点_1" href="#这里是列表文本运行机器人节点_1"></a>这里是列表文本运行机器人节点</h3>
<p><code>roslaunch rbx1_bringup fake_turtlebot.launch</code></p>
<h3><a class="anchor" id="运行amcl节点-使用测试地图_1" href="#运行amcl节点-使用测试地图_1"></a>运行amcl节点，使用测试地图</h3>
<p><code>roslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml</code></p>
<h3><a class="anchor" id="运行-rviz_1" href="#运行-rviz_1"></a>运行：rviz</h3>
<p><code>rosrun rviz rviz -d</code>rospack find rbx1_nav<code>/amcl.rviz</code></p>
<h3><a class="anchor" id="运行rosbridge-websocket_1" href="#运行rosbridge-websocket_1"></a>运行RosBridge_websocket</h3>
<p><code>roslaunch rosbridge_server rosbridge_websocket.launch</code></p>
<h3><a class="anchor" id="运行效果-_1" href="#运行效果-_1"></a>运行效果：</h3>
<p><img alt="输入图片说明" src="https://images.gitee.com/uploads/images/2018/0707/122237_d83cb371_1509932.png" title="屏幕截图.png" /></p>
</div><div class='title'>用户终端</div><div class='content'></div><div class='title'>Rbx1机器人一键启动</div><div class='content'><h3><a class="anchor" id="第一步-创建一个新的package_1" href="#第一步-创建一个新的package_1"></a>第一步,创建一个新的package</h3><div class="white"><div class="highlight"><pre>cd ~/catkin_ws/src
catkin_create_pkg admin
catmake
</pre></div></div><h3><a class="anchor" id="在admin下建立launch目录-然后创建_1" href="#在admin下建立launch目录-然后创建_1"></a>在admin下建立launch目录，然后创建</h3>
<p><code>start.launch</code></p>
<h3><a class="anchor" id="内容如下_1" href="#内容如下_1"></a>内容如下</h3><div class="white"><div class="highlight"><pre>&lt;launch&gt;
    &lt;include file="$(find rbx1_bringup)/launch/fake_turtlebot.launch" /&gt; 
    &lt;include file="$(find rbx1_nav)/launch/fake_amcl.launch"&gt; 
        &lt;param name="map" value="test_map.yaml"/&gt;
    &lt;/include&gt;
  &lt;node name="rviz" pkg="rviz" type="rviz" args="-d $(find rbx1_nav)/amcl.rviz" /&gt;
  &lt;include file="$(find rosbridge_server)/launch/rosbridge_websocket.lah" /&gt;
&lt;/launch&gt;
</pre></div></div><h3><a class="anchor" id="运行机器人-_1" href="#运行机器人-_1"></a>运行机器人：</h3>
<p><code>roslaunch admin start.launch</code></p>
</div><div class='title'>WPF</div><div class='content'></div><div class='title'>界面展示</div><div class='content'></div>
          </div>
        </div>
      </div>
      </div>
  </div>
</body>
</html>